package jdx_14_基于CAS的新锁;

import java.util.concurrent.locks.ReentrantLock;

public class T05_ReentrantLock5 extends Thread {
    /*
    [问题]什么是公平锁？
    当多条线程都在征用同一个资源的时候，会处于队列之中。
    (1)公平锁:当有一条线程也要使用该资源的时候，会先去判断队列中是否有线程，如果有，则自己加入队列。
        [注意]:公平锁并不是绝对的公平
    (2)非公平锁:不去判断队列，而是直接竞争资源。
     */

	private static ReentrantLock lock=new ReentrantLock(true);//true:表示公平锁 (修改布尔值进行第二次实验)
    public void run() {
        for(int i=0; i<100; i++) {
            lock.lock();
            try{
                System.out.println(Thread.currentThread().getName()+"获得锁");
            }finally{
                lock.unlock();
            }
        }
    }
    public static void main(String[] args) {
        T05_ReentrantLock5 rl=new T05_ReentrantLock5();
        Thread th1=new Thread(rl);
        Thread th2=new Thread(rl);
        th1.start();
        th2.start();
    }
}
/*
[输出]
(1)true:公平锁:线程1和线程2交替打印
(2)false:非公平锁:线程1几乎执行完了,线程2才开始执行

[小结] 这些都是 synchronized 没有的特点:
(1)trylock 尝试获取锁
(2)lockInterruptibly 可以被打断
(2)公平和非公平的切换
 */

